Oracle RMAN WINDOWS 备份脚本

1 推荐的 RMAN 配置项

你可以通过以下命令在 RMAN 中逐条执行,或写入脚本文件:

rman target /

# 1️⃣ 保留策略:保留 14 天内可恢复(常规推荐)
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;

# (可选)或者只保留最近 2 个全备(Redundancy)
-- CONFIGURE RETENTION POLICY TO REDUNDANCY 2;

# 2️⃣ 控制文件自动备份(强烈建议开启)
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'D:\rman\backups\ctl_auto_%F.ctl';

# 3️⃣ 备份压缩(节省空间,建议开启)
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO COMPRESSED BACKUPSET;

# 4️⃣ 默认备份路径(建议指定固定路径)
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'D:\rman\default_%d_%U.bkp';

# 5️⃣ 自动通道释放,避免占用资源
--CONFIGURE DEVICE TYPE DISK CLEAR;  -- 确保使用脚本中的 allocate/release 模式

# 6️⃣ 设置恢复目录连接(如有)
-- CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\oracle_backups\snapcf_ORCL.f';

# 7️⃣ 清除默认备份策略(如你使用脚本中自定义 format)
-- CONFIGURE CHANNEL DEVICE TYPE DISK CLEAR;

2 查看当前 RMAN 配置

你可以通过以下命令查看当前配置:

rman target /
SHOW ALL;

3 可选:启用块级校验(增强一致性检查)

CONFIGURE BACKUP OPTIMIZATION ON;

这样如果你做了重复内容的增备,RMAN 会跳过没变化的块。


4 关于 delete obsolete 生效条件

它依据你上面设置的保留策略(retention policy):


5 小结:推荐配置组合

配置项 建议值
保留策略 TO RECOVERY WINDOW OF 7 DAYS(7天可恢复)
控制文件自动备份 ON + 指定文件名格式
备份压缩 COMPRESSED BACKUPSET(节省空间)
并行度 PARALLELISM 1(可根据 CPU 增加)
默认路径/格式 建议明确路径,统一管理
自动释放通道 建议在脚本中 allocate/release;CONFIGURE DEVICE ... CLEAR

如你有恢复目录(RMAN catalog)或使用 FRA(闪回恢复区),我也可以给出推荐策略。是否需要针对FRA场景或Data Guard 备库场景的配置补充?
以下是基于你要求的完整备份方案,适用于 Windows Server 2012 R2 + Oracle 11g,并包含:


6 文件目录结构建议

D:\rman\
├── scripts\
│   ├── full_backup.bat
│   ├── incr_backup.bat
│   ├── delete_obsolete.bat
│   ├── full_backup.rman
│   ├── incr_backup.rman
│   ├── delete_obsolete.rman
│   └── restore_db.rman
├── backups\
├── logs\
│   └── *.log

7 脚本内容

7.1 full_backup.bat(Level 0 全量备份)

@echo off
set ORACLE_SID=ORCL
set ORACLE_HOME=D:\app\product\11.2.0\dbhome_1
set PATH=%ORACLE_HOME%\bin;%PATH%
set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%
set LOGFILE=D:\rman\logs\full_%TODAY%.log
echo [%date% %time%] Starting FULL backup >> %LOGFILE%
rman target / cmdfile=D:\rman\scripts\full_backup.rman log=%LOGFILE%
IF %ERRORLEVEL% NEQ 0 (
    echo [%date% %time%] FULL backup FAILED >> %LOGFILE%
) ELSE (
    echo [%date% %time%] FULL backup COMPLETED >> %LOGFILE%
)


7.2 full_backup.rman

run {
  allocate channel c1 device type disk;
  allocate channel c2 device type disk;
  allocate channel c3 device type disk;
  allocate channel c4 device type disk;
  backup incremental level 0 tag 'FULL_BACKUP'
    format 'D:\rman\full\full_%d_%T_%U.bkp' database;
  backup current controlfile
    format 'D:\rman\full\ctl_%d_%T_%U.ctl';
  backup archivelog all delete input
    format 'D:\rman\full\arch_%d_%T_%U.arc';
  crosscheck backup;
  CROSSCHECK ARCHIVELOG ALL;
  delete noprompt obsolete;
  DELETE EXPIRED BACKUP;
  DELETE EXPIRED ARCHIVELOG ALL;
  release channel c1;
  release channel c2;
  release channel c3;
  release channel c4;
}

7.3 incr_backup.bat(Level 1 差异增量备份)

@echo off
set ORACLE_SID=ORCL
set ORACLE_HOME=D:\app\product\11.2.0\dbhome_1
set PATH=%ORACLE_HOME%\bin;%PATH%
set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%
set LOGFILE=D:\rman\logs\incr_%TODAY%.log
echo [%date% %time%] Starting INCREMENTAL backup >> %LOGFILE%
rman target / cmdfile=D:\rman\scripts\incr_backup.rman log=%LOGFILE%
IF %ERRORLEVEL% NEQ 0 (
    echo [%date% %time%] INCREMENTAL backup FAILED >> %LOGFILE%
) ELSE (
    echo [%date% %time%] INCREMENTAL backup COMPLETED >> %LOGFILE%
)

7.4 incr_backup.rman

run {
  allocate channel c1 device type disk;
  allocate channel c2 device type disk;
  allocate channel c3 device type disk;
  allocate channel c4 device type disk;
  backup incremental level 1 tag 'INCR_BACKUP'
    format 'D:\rman\incr\incr_%d_%T_%U.bkp' database;
  backup current controlfile
    format 'D:\rman\incr\ctl_%d_%T_%U.ctl';
  backup archivelog all delete input
    format 'D:\rman\incr\arch_%d_%T_%U.arc';
  crosscheck backup;
  CROSSCHECK ARCHIVELOG ALL;
  delete noprompt obsolete;
  DELETE EXPIRED BACKUP;
  DELETE EXPIRED ARCHIVELOG ALL;
  release channel c1;
  release channel c2;
  release channel c3;
  release channel c4;
}


8 恢复脚本(用于全库恢复)

  1. restore_db.rman 脚本文件内容。
startup mount;
run {
  allocate channel c1 device type disk;
  restore database;
  recover database;
  release channel c1;
}
alter database open resetlogs;
  1. 使用方式(手动运行)。
rman target / cmdfile=D:\oracle_backups\scripts\restore_db.rman

9 报错处理机制建议

常见错误及处理方法:

错误代码 说明 处理建议
ORA-19809 无法写入备份文件(空间不足) 检查磁盘空间,或删除旧备份
ORA-19504 设备拒绝访问 检查权限、路径是否存在
ORA-27037 无法打开文件 检查路径是否拼写正确
ORA-12560 监听器连接失败 确保监听器正常、ORACLE_SID 正确

你可以在 .bat 脚本中加入 %ERRORLEVEL% 判断是否成功,并邮件或事件记录等。


10 建议的备份调度策略(任务计划)

类型 执行频率 脚本文件
全备(Level 0) 每周日凌晨1点 full_backup.bat
增备(Level 1) 每天凌晨2点 incr_backup.bat

使用“任务计划程序”配置自动运行即可。

11 项目打包

以下所有脚本包含在这个 [[rman.zip]] 中。请下载使用。